using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Campus.Entities;
using CampusSite.Models;
using CampusSite.ViewModels;
using CampusSite.Security;
namespace CampusSite.Controllers
{
    [RoleAuthorize(Constantes.RolAdministrador)]
    [RolActionFilter]
    public class PagosMensualesController : Controller
    {
        private readonly IActividadRepository actividadRepository;
        private readonly IEstudianteRepository estudianteRepository;
        private readonly IPagoMensualRepository pagomensualRepository;

        // If you are using Dependency Injection, you can delete the following constructor
        public PagosMensualesController()
            : this(new ActividadRepository(), new EstudianteRepository(), new PagoMensualRepository())
        {
        }

        public PagosMensualesController(IActividadRepository actividadRepository, IEstudianteRepository estudianteRepository, IPagoMensualRepository pagomensualRepository)
        {
            this.actividadRepository = actividadRepository;
            this.estudianteRepository = estudianteRepository;
            this.pagomensualRepository = pagomensualRepository;
        }

        //
        // GET: /PagosMensuales/

        public ViewResult Index()
        {
            return View(pagomensualRepository.AllIncluding(pagomensual => pagomensual.Actividad, pagomensual => pagomensual.Estudiante));
        }

        //
        // GET: /PagosMensuales/Details/5

        public ViewResult Details(int id)
        {
            return View(pagomensualRepository.Find(id));
        }

        //
        // GET: /PagosMensuales/Create
        [OutputCache(Location = System.Web.UI.OutputCacheLocation.None)]
        public ActionResult Create(int EstudianteId, int ActividadId)
        {
            var estudiante = estudianteRepository.Find(EstudianteId);
            var monto = 0f;
            var mes = 1;
            int mesInicioActividades = 3; //TODO: lista configuracion 
            int mesFinActividades = 12; //TODO: lista configuracion 
            monto = estudiante.CuotaMensual;
            PagoMensual ultimoPago = null;

            if (ActividadId > 0)
            {
                ViewBag.PossibleActividads = new List<Actividad> { actividadRepository.Find(ActividadId) };
                ultimoPago = pagomensualRepository.All
                                                .Where(pm => pm.EstudianteId == EstudianteId && pm.ActividadId == ActividadId && !pm.IsBorrado)
                                                .OrderByDescending(p => p.FechaDePago)
                                                .OrderByDescending(p => p.Mes)
                                                .FirstOrDefault();
                
            }
            else
            {
                var actividades = estudiante.Grupos
                                    .Select(g => g.Actividad)
                                    .Where(a => ("mensual".Equals(a.FrecuenciaDePago.Nombre.ToLower())))
                                    .Distinct()
                                    .ToList();
                if (actividades.Count == 1)
                {
                    ActividadId = actividades[0].ActividadId;
                    ultimoPago = pagomensualRepository.All
                                                .Where(pm => pm.EstudianteId == EstudianteId && pm.ActividadId == ActividadId && !pm.IsBorrado)
                                                .OrderByDescending(p => p.FechaDePago)
                                                .OrderByDescending(p => p.Mes)
                                                .FirstOrDefault();
                    
                }

                ViewBag.PossibleActividads = actividades;

            }

            if (ultimoPago != null)
            {
                mes = ++ultimoPago.Mes;
                if (mes > mesFinActividades)
                { mes = 0; }
            }
            else
            {
                if (estudiante.FechaIngreso.Year == DateTime.Now.Year && estudiante.FechaIngreso.Month > mesInicioActividades)
                {
                    mes = estudiante.FechaIngreso.Month;
                }
                else
                {
                    mes = mesInicioActividades;
                }
            }

            estudiante.TotalAdeudado = estudianteRepository.GetDeudaEstudiante(estudiante.EstudianteId, ActividadId);
            ViewBag.PossibleEstudiantes = new List<Estudiante> { estudiante };


            return PartialView(
                new PagoMensual
                {
                    EstudianteId = EstudianteId,
                    Estudiante = estudiante,
                    ActividadId = ActividadId,
                    FechaDePago = DateTime.Now,
                    Monto = monto,
                    Mes = mes
                });
        }

        //
        // POST: /PagosMensuales/Create

        [HttpPost]
        public ActionResult Create(PagoMensual pagomensual)
        {
            MensajeVM mensaje;
            string sMensaje;                                
            try
            {
                if (ModelState.IsValid)
                {
                    
                    var ultimoPago = pagomensualRepository.All
                                        .Where(p => p.ActividadId == pagomensual.ActividadId && p.EstudianteId == pagomensual.EstudianteId && p.Mes == pagomensual.Mes && !p.IsBorrado)
                                        .OrderByDescending(p => p.FechaDePago)
                                        .FirstOrDefault();
                    if (ultimoPago == null || (ultimoPago != null && ultimoPago.FechaDePago.Year != DateTime.Now.Year))
                    {
                        pagomensualRepository.InsertOrUpdate(pagomensual);
                        pagomensualRepository.Save();
                        //return RedirectToAction("Details", "Estudiantes", new { id = pagomensual.EstudianteId });

                        sMensaje = string.Format("El pago del mes {0}, del alumno {1} fue realizado correctamente.", pagomensual.Mes, estudianteRepository.Find(pagomensual.EstudianteId).Apyn);
                        mensaje = new MensajeVM(sMensaje, MensajeVM.MensajeTipo.Success);

                        return RedirectToAction("Index", "Home", new { Mensaje = mensaje.Mensaje, TipoMensaje = (int) mensaje.TipoMensaje });
                    }

                    //ModelState.AddModelError(string.Empty, "Ese mes ya estaba pago."); // TODO: informar de que ya estba pago
                    sMensaje = string.Format("El pago del mes {0}, del estudiante {1} ya estaba pago.",  pagomensual.Mes, estudianteRepository.Find(pagomensual.EstudianteId).Apyn);
                    mensaje = new MensajeVM(sMensaje, MensajeVM.MensajeTipo.Warning);

                    return RedirectToAction("Index", "Home", new { Mensaje = mensaje.Mensaje, TipoMensaje = (int)mensaje.TipoMensaje }); 
                }
                else
                {
                    return View();
                }
            }
            catch (Exception ex)
            {
                sMensaje = string.Format("Ocurrio un error al procesar el pago del mes {0}, del estudiante {1}. Detalles: {2}", pagomensual.Mes, estudianteRepository.Find(pagomensual.EstudianteId).Apyn, ex.Message);
                mensaje = new MensajeVM(sMensaje,  MensajeVM.MensajeTipo.Error);
                return RedirectToAction("Index", "Home", new { Mensaje = mensaje.Mensaje, TiporMensaje = (int) mensaje.TipoMensaje });
            }
            
        }

        /// <summary>
        /// Registra todos los pagos de todos los estudiantes
        /// </summary>
        public void pagarTodoCargaInicial()
        {
            List<Estudiante> estudiantes = estudianteRepository.All.ToList();

            foreach (var estudiante in estudiantes)
            {                                                
                PagarTodo(estudiante.EstudianteId, 1);
            }
        }

        public string PagarTodo(int EstudianteId, int ActividadId)
        {            
            string mensaje;
            MensajeVM miMensaje;
            Estudiante estudiante = estudianteRepository.Find(EstudianteId);
            try
            {
                pagomensualRepository.PagarTodo(EstudianteId, ActividadId);
                pagomensualRepository.Save();
                mensaje = string.Format("El pago total de la deuda del estudiante {0}, fue realizado correctamente.", estudiante.Apyn);
                miMensaje = new MensajeVM(mensaje, MensajeVM.MensajeTipo.Success);
                string urlMessage = string.Format("/Home/Index/?Mensaje={0}&TipoMensaje={1}", miMensaje.Mensaje, (int)miMensaje.TipoMensaje);
                //return RedirectToAction("Index", "Home", new { Mensaje = miMensaje.Mensaje, TipoMensaje = (int) miMensaje.TipoMensaje });
                return urlMessage;
            }
            catch (Exception ex)
            {

                mensaje = string.Format("Ocurrio un error al procesar el pago de la deuda total, del estudiante {0}. Detalles: {1}", estudiante.Apyn, ex.Message);
                miMensaje = new MensajeVM(mensaje, MensajeVM.MensajeTipo.Error);

                string urlMessage = string.Format("/Home/Index/?Mensaje={0}&TipoMensaje={1}", miMensaje.Mensaje, (int)miMensaje.TipoMensaje);
                return urlMessage;
                //return RedirectToAction("Index", "Home", new { Mensaje = miMensaje.Mensaje, TiporMensaje = (int)miMensaje.TipoMensaje});
            }
            
        }

        //
        // GET: /PagosMensuales/Edit/5

        public ActionResult Edit(int id)
        {
            PagoMensual pm = pagomensualRepository.Find(id);
            ViewBag.PossibleActividads = new List<Actividad> { actividadRepository.Find(pm.ActividadId) };
            ViewBag.PossibleEstudiantes = new List<Estudiante> { estudianteRepository.Find(pm.EstudianteId)};
            ViewBag.PossibleMeses = new List<int> { pm.Mes };

            return View(pm);
        }

        //
        // POST: /PagosMensuales/Edit/5

        [HttpPost]
        public ActionResult Edit(PagoMensual pagomensual)
        {
            if (ModelState.IsValid)
            {
                pagomensualRepository.InsertOrUpdate(pagomensual);
                pagomensualRepository.Save();
                return RedirectToAction("Index");
            }
            else
            {
                ViewBag.PossibleActividads = actividadRepository.All;
                ViewBag.PossibleEstudiantes = estudianteRepository.All;
                return View();
            }
        }

        //
        // GET: /PagosMensuales/Delete/5

        public ActionResult Delete(int id)
        {
            return View(pagomensualRepository.Find(id));
        }

        //
        // POST: /PagosMensuales/Delete/5

        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(int id)
        {
            PagoMensual pago = pagomensualRepository.Find(id);

            pago.IsBorrado = true;
            //pagomensualRepository.Delete(id);
            pagomensualRepository.Save();
            
            //string url = ViewBag.PreviousURL.ToString();

            return RedirectToAction("../Estudiantes/Detail", new { id = pago.EstudianteId });
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                actividadRepository.Dispose();
                estudianteRepository.Dispose();
                pagomensualRepository.Dispose();
            }
            base.Dispose(disposing);
        }
    }
}

